Enumerating Process Objects Using PDH

The example in this topic uses the PDH interface to enumerate the process objects on the system.

#ifdef UNICODE

#ifndef _UNICODE

#define _UNICODE  1

#endif

#define tmain     wmain

#else

#define tmain     main

#endif

 

// This program only needs the essential windows header files.

#define WIN32_LEAN_AND_MEAN 1

 

#include <windows.h>

#include <winperf.h>

#include <malloc.h>

#include <stdio.h>

#include <tchar.h>

#include <pdh.h>

 

int

tmain ()

    PDH_STATUS  pdhStatus               = ERROR_SUCCESS;

    LPTSTR      szCounterListBuffer     = NULL;

    DWORD       dwCounterListSize       = 0;

    LPTSTR      szInstanceListBuffer    = NULL;

    DWORD       dwInstanceListSize      = 0;

    LPTSTR      szThisInstance          = NULL;

 

 

// Determine the required buffer size for the data.

 

    pdhStatus = PdhEnumObjectItems (

        NULL,                   // reserved

        NULL,                   // local machine

        TEXT("Process"),        // object to enumerate

        szCounterListBuffer,    // pass in NULL buffers

        &dwCounterListSize,     // an 0 length to get

        szInstanceListBuffer,   // required size

        &dwInstanceListSize,    // of the buffers in chars

        PERF_DETAIL_WIZARD,     // counter detail level

        0);

 

    if (pdhStatus == ERROR_SUCCESS)

   

    // Allocate the buffers and try the call again.

        szCounterListBuffer = (LPTSTR)malloc (

            (dwCounterListSize * sizeof (TCHAR)));

        szInstanceListBuffer = (LPTSTR)malloc (

            (dwInstanceListSize * sizeof (TCHAR)));

        if ((szCounterListBuffer != NULL) &&

            (szInstanceListBuffer != NULL))

       

            pdhStatus = PdhEnumObjectItems (

                NULL,   // reserved

                NULL,   // local machine

                TEXT("Process"), // object to enumerate

                szCounterListBuffer,    // pass in NULL buffers

                &dwCounterListSize,     // an 0 length to get

                szInstanceListBuffer,   // required size

                &dwInstanceListSize,    // of the buffers in chars

                PERF_DETAIL_WIZARD,     // counter detail level

                0);     

            if (pdhStatus == ERROR_SUCCESS)

           

                _tprintf (TEXT("\nRunning Processes:"));

            // Walk the return instance list.

                for (szThisInstance = szInstanceListBuffer;

                     *szThisInstance != 0;

                     szThisInstance += lstrlen(szThisInstance) + 1)

               

                     _tprintf (TEXT("\n  %s"), szThisInstance);

                }

            }

        }

        else

       

            _tprintf (TEXT("\nPROCLIST: unable to allocate buffers"));

        }

 

        if (szCounterListBuffer != NULL)

            free (szCounterListBuffer);

 

        if (szInstanceListBuffer != NULL)

            free (szInstanceListBuffer);

    }

    else

   

        _tprintf(TEXT("\nUnable to determine required buffer size."));

    }

    return 0;

}